package com.itheima.jdk;

import com.itheima.dao.impl.StuDaoImpl;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class DemoCglibProxy {
    public static void main(String[] args) {
        //1.创建目标对象
        StuDaoImpl sdi = new StuDaoImpl();
        //2.创建代理对象
        /*
        * Cglib动态代理:基于类
        * 涉及到类:Eahancer
        * 涉及方法:
        * create(param1,param2)
        * 参数:
        * param1:指定代理的目标对象字节码类型(固定写法)
        * param2:代理处理,需要程序自己手动实现
        *
        * com.itheima.dao.impl.StuDaoImpl$$EnhancerByCGLIB$$73f359b1
        * */
       StuDaoImpl sd = (StuDaoImpl) Enhancer.create(sdi.getClass(), new MethodInterceptor() {
            /*
             * @param proxy  代理对象(如果不指定目标对象,则此代理对象为null)
             * @param method  执行的方法对象
             * @param args  执行方法对象的参数列表
             * @return   返回的方法对象的返回值,如果执行的方法是void,则此返回值可以为null
             * @param methodProxy
             * @throws Throwable
             * */

            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                Object obj = null;
                try {
                    System.out.println("前置增强");//在目标方法执行之前,称之为前置增强
                    obj=method.invoke(sdi,args);//执行userDao对象中带有args参数列表的method方法
                    System.out.println("后置增强");
                } catch (Exception e) {
                    System.out.println("异常增强");
                } finally {
                    System.out.println("最终增强");
                }
                return obj;
            }
        });
       sd.save();
    }
}
